package cn.dglydrpy.study.webserver.core;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import cn.dglydrpy.study.webserver.servlet.HttpServlet;


/**
 * 服务器相关信息定义
 */
public class ServerContext {
	
	//存Servlet映射信息  K:url  V:Servlet
	private static Map<String,HttpServlet> servletMapping = new HashMap<String,HttpServlet>();

	static{
		initServletMapping();
	}
	
	/**
	 * 初始化Servlet映射信息
	 */
	private static void initServletMapping(){
		/*
		 * 解析conf/servlets.xml文件，将根标签下所有名为<servlet>的子标签得到，
		 * 然后将每个servlet子标签中的属性path作为key将属性className的值得到后,
		 * 利用反射加载这个类的类对象并进行实例化
		 * 将实例化的对象作为value保存到servletMapping这个Map中完成初始化。
		 */
		try {
			SAXReader reader = new SAXReader();
			Document doc = reader.read(
					new File(Constant.RESOURCES_DIR+"servlets.xml"));
			Element root = doc.getRootElement();
			List<Element> servlets = root.elements();
			for(Element servletEle : servlets) {
				String key = servletEle.attributeValue("path");	
				String className = servletEle.attributeValue("className");
				Class cls = Class.forName(className);
				HttpServlet servlet = (HttpServlet)cls.newInstance();
				
				servletMapping.put(key, servlet);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 检查给定的url是否对应Servlet处理
	 * @param path
	 * @return
	 */
	public static boolean hasServlet(String path){
		//用给定的url检查是否作为key存在即可知道是否对应一个Servlet
		return servletMapping.containsKey(path);
	}
	/**
	 * 根据给定的url获取对应的Servlet
	 * @param path
	 * @return
	 */
	public static HttpServlet getServlet(String path){
		return servletMapping.get(path);
	}
}
